
/*
@file      445.cpp
@brief     两数相加II[https://leetcode.cn/problems/add-two-numbers-ii/description/]
@author    EricsT (EricsT@163.com)
@version   v1.0.0
@date      2025-10-14
@history   2025-10-14 EricsT - 新建文件
*/

#include "../Solution.h"


ListNode* Solution::addTwoNumbers(ListNode* l1, ListNode* l2)
 {
        vector<int> vt1; // 数1
        while (nullptr != l1) {
            vt1.push_back(l1->val);
            l1 = l1->next;
        }

        vector<int> vt2; // 数2
        while (nullptr != l2) {
            vt2.push_back(l2->val);
            l2 = l2->next;
        }

        int size1 = vt1.size(); // 数1位数
        int size2 = vt2.size(); // 数2位数
        int del = 0;            // 位数差

        int sizeMax = 0;   // 位数最大值
        vector<int> vtMax; // 大数
        vector<int> vtMin; // 小数

        if (size1 > size2) { // 数1位数大
            del = size1 - size2;
            sizeMax = size1;
            vtMax = vt1;
            vtMin = vt2;
        }
        else { // 数2位数大，或二者位数相等
            del = size2 - size1;
            sizeMax = size2;
            vtMax = vt2;
            vtMin = vt1;
        }

        ListNode* listNode = new ListNode();

        int iIndex = sizeMax - 1;

        int Add = 0; // 进位

        do {
            ListNode* listNodeTail = new ListNode();

            int val = vtMax[iIndex] + Add;
            if (iIndex - del >= 0)
                val = val + vtMin[iIndex - del]; // 小数有位数的时候加上小数值

            listNodeTail->val = val % 10; // 取个位
            Add = val / 10;               // 取进位

            listNodeTail->next = listNode->next;
            listNode->next = listNodeTail;
            iIndex--;

        } while (iIndex >= 0);

        if (Add) {
            ListNode* listNodeTail = new ListNode();
            listNodeTail->val = Add; // 取个位

            listNodeTail->next = listNode->next;
            listNode->next = listNodeTail;
        }
        return listNode->next;
    }